//
//  JGVividEngineDataDefine.h
//  JGVividEngine
//
//  Created by jagger.tu on 2025/2/13.
//

#import <Foundation/Foundation.h>

#ifndef JGVividEngineDataDefine_h
#define JGVividEngineDataDefine_h

#if defined (__cplusplus)
extern "C" {
#endif

/// 游戏错误码
typedef NS_ENUM(NSInteger, JGError) {
    /// 基准码，1 开头统一为错误码
    JGErrorBase = 1000,
    /// 服务器繁忙：启动游戏失败
    JGErrorServerBusy = 1001,
    /// 游戏过程中异常中断
    JGErrorGameLaunchFailed = 1002,
    /// 内部协议错误
    JGErrorProtocol = 1003,
    /// 硬件性能不足
    JGErrorHardware = 1004,
    /// 加载游戏超时/请求超时
    JGErrorTimeout = 1005,
    /// Token过期/非法 -- 需要更新Token
    JGErrorTokenExpired = 1006,
    /// 游戏ID不正确：游戏不存在或被下架、拉起游戏时记录不存在
    JGErrorGameIDInvalid = 1007,
    /// 应用未授权使用SDK
    JGErrorUnauthorized = 1009,
    /// 余额不足
    JGErrorBalanceLow = 1010,
    /// 游戏拉起失败，有游戏正在运行
    JGErrorGameRunning = 1011,
    /// 游戏资源正在回收，暂无法使用
    JGErrorResourceRecycling = 1012,
    /// CDKey失败
    JGErrorCDKeyFailed = 1014,
    /// 恢复串流超时或失效（非必须，仅供对齐，不推荐使用）
    JGErrorResumeStreamingTimeout = 1015,
    /// 游戏参数无效
    JGErrorGameParamInvalid = 1017,
};


/// 游戏运行状态码
typedef NS_ENUM(NSInteger, JGStatus) {
    /// 基准码，2开头为状态码
    JGStatusBase = 2000,
    /// 开始渲染
    JGStatusGameStartRender = 2001,
    /// 正在排队
    JGStatusServerInQueue = 2002,
    /// 准备分配资源
    JGStatusServerPreallocate = 2003,
    /// 资源分配成功
    JGStatusServerAllocateSuccess = 2004,
    /// 已废弃，合并至2002
    JGStatusServerAllocateFailed = 2005,
    /// 游戏不活跃/游戏长时间未操作提醒
    JGStatusServerGameInactive = 2006,
    /// 退出游戏
    JGStatusGameClosed = 2007,
    /// 更新排队进度
    /// 参数key: total, 排队总数
    /// 参数key: currank, 当前所在的排队号
    /// 参数key: ewtime, 预计剩余时间
    JGStatusServerUpdateQueueRank = 2008,
    /// 游戏被踢下线
    JGStatusServerGameKickoff = 2009,
    /// 余额不足提醒
    /// 参数key: balance, 表示剩余余额
    JGStatusBalanceLow = 2010,
    /// 余额不足游戏资源被回收
    JGStatusBalanceLowGameKilled = 2011,
    /// 游戏空闲超时，游戏资源被回收
    JGStatusIdleTimeoutGameKilled = 2012,
    /// 游戏资源长时间未开始，超时被回收
    JGStatusHoldTimeoutGameKilled = 2013,
    /// 鉴权成功
    JGStatusAuthSuccess = 2014,
    /// 游戏正在升级更新
    JGStatusGameUpgrading = 2016,
    /// 游戏串流恢复成功
    JGStatusResumeStreamSuccess = 2017,
    /// 游戏串流恢复失败
    JGStatusResumeStreamFailed = 2018,
    /// 网络异常、断线
    JGStatusNetworkFailed = 2020,
    /// 游戏在后台导致的串流超时等错误（非必须，仅供对齐，不推荐使用）
    JGStatusBackgroundTimeoutNotRecommended = 2022,
    /// 呼出输入键盘 | 键盘状态更新
    /// 参数key: bPush BOOL 是否弹出
    /// 参数key: content NSString , 附带的输入框已经存在的内容
    JGStatusKeyboardStatusUpdate = 2025,
    /// 通知被协助者开始协助
    JGStatusAssistedStart = 2026,
    /// 通知被协助者停止协助
    JGStatusAssistedStop = 2027,
    /// 通知协助者中断协助（被踢）
    JGStatusAssistInterrupt = 2028,
    /// 协助游戏终止（房主退出游戏）
    JGStatusAssistOver = 2029,
    /// 其他人加入对战
    JGStatusAgainstJoin = 2030,
    /// 其他人离开对战
    JGStatusAgainstQuit = 2031,
    /// 中断对战（被踢）
    JGStatusAgainstInterrupted = 2032,
    /// 对战游戏终止（房主退出游戏）
    JGStatusAgainstOver = 2033,
    /// 通知被切屏的旧设备切屏成功
    JGStatusSwitchDeviceSuccess = 2034,
    /// 通知切屏的新设备切屏失败
    JGStatusSwitchDeviceFailed = 2035,
    /// 加入对战失败
    JGStatusJoinAgainstFailed = 2036,
    /// 通知协助者协助失败
    JGStatusAssistFailed = 2037,
    /// 协助目标不是房主
    JGStatusAssistIsNotOwner = 2038,
    /// 协助目标已被其他人协助
    JGStatusAssistOtherJoined = 2039,
    /// 游戏画面出现
    JGStatusGameRendering = 2040,
    /// 玩家不支持H.265
    JGStatusNoSupportHEVC = 2041,
    /// 同实例参数异常
    JGStatusInstanceParameterError = 2042,
    /// 房主原因导致无法同实例
    JGStatusInstanceOwnerException = 2043,
    /// 游戏被后台终止
    JGStatusInstanceTerminated = 2044,
    /// 申请手柄资源成功
    /// key: deviceId  设备ID
    /// key: slotId 分配的虚拟卡槽
    JGStatusGamepadAllocSuccess = 2045,
    /// 申请手柄资源失败
    /// key: deviceId  设备ID
    JGStatusGamepadAllocFailed = 2046,
    /// 释放手柄资源成功
    /// key: deviceId  设备ID
    /// key: slotId 分配的虚拟卡槽
    JGStatusGamepadReleaseSuccess = 2047,
    /// 释放手柄资源失败
    /// key: deviceId  设备ID
    /// key: slotId 分配的虚拟卡槽
    JGStatusGamepadReleaseFailed = 2048,
    /// 串流异常中断正在重连（非必须，仅供对齐，不推荐使用）
    JGStatusStreamInterruptReconnectingNotRecommended = 2052,
    /// 开始重新串流（非必须，仅供对齐，不推荐使用）
    JGStatusStartStreamingAgainNotRecommended = 2053,
    /// 排队结束（非必须，仅供对齐，不推荐使用）
    JGStatusEndOfQueueNotRecommended = 2056,
    /// 网络异常(废弃)见 2020 码
    JGStatusNetworkException = 2060,
    /// 存档异常
    JGStatusArchiveException = 2061,
    /// 排队终止由于出现异常，异常原因"exitCode"
    ///  exit_code: 0: 正常结束排队(无仅定义无通知),1:异常退出排队(结束串流),2:其他设备已经排队中,3:游戏开启维护,4:排队心跳超时
    JGStatusQueueTerminatedFromException = 2071,
    /// 加入观看(通知房间内所有人)
    JGStatusJoinWatching = 2080,
    /// 离开观看(通知房间内所有人)
    JGStatusLeaveWatching = 2081,
    /// 加入观看失败(通知观看者)
    JGStatusJoinWatchingFailed = 2082,
    /// 踢出观看者(通知观看者)
    JGStatusKickOutWatcher = 2085,
    /// 观看游戏终止(通知房间内所有人)
    JGStatusWatchingTerminated = 2086,
    /// 测速启动(已废弃)
    JGStatusTestSpeedBegin = 2092,
    /// 测速网络较差(已废弃)
    JGStatusTestSpeedFailed = 2093,
    /// 后台切前台串流开始渲染
    JGStatusAppToFrontRender = 2095,
    /// 已忽略第一个输入事件(已废弃)
    JGStatusIgnoredFirstInput = 2096,
    /// 扫码手柄连接成功
    JGStatusQRGamepadConnected = 2200,
    /// 扫码手柄连接失败
    JGStatusQRGamepadConnectFailed = 2201,
    /// 正在进行存档迁移
    JGStatusGameArchiveMigration = 2202,
    /// 游戏内返回的数据报文,对应参数key: "gameDataContent"
    JGStatusRecvdGameData = 2300,
    /// 游戏横竖屏切换通知
    /// 参数Key: orientation  0 表示横屏 1 表示竖屏
    JGStatusGameStreamRotationChanged = 2301,
    /// 安装手柄驱动失败(废弃)
    JGStatusInstallationGamepadDriverFailed = 2302,
    /// 设置码率模式结果
    /// 参数key: setting number: 0: 设置码率  1: 设置帧率  2: 设置分辨率 3:设置编码器 4:设置开关光标, 5:设置编码器参数 6:设置剪切板 7:设置鼠标速度 8:设置CBS 9: 设置码率指导调整模式
    /// 参数key: status number 0 成功 非0 为失败码
    JGStatusSetBitrateModeResult = 2303,
    
    /// 打开麦克风没有权限时，通知请求麦克风权限
    JGStatusRequestMicrophonePermissions = 6001,
    /// 打开摄像头没有权限时，通知请求摄像头权限
    JGStatusRequestCameraPermissions = 6002,
    
    // 小窗模式，设置限制心跳时间成功
    JGStatusResetHangupTimeSuccess = 7000,
    // 小窗模式，设置限制心跳时间失败
    JGStatusResetHangupTimeFailed = 7001,
    // be返回的游戏启动耗时
    JGStatusBaseUnifyRuleStart = 7002,
    // LS返回的游戏启动耗时
    JGStatusGameStartLsTime = 7003,
    // 渲染卡顿上报
    JGStatusRenderStuckReport = 7004,
    // 游戏启动时长分阶段上报
    JGStatusGameStartTimeCostReport = 7005,
    // 游戏内场景识别成功
    JGStatusGameSceneMeasureStatus = 7006,
    // 流量加速成功
    JGStatusNetworkPrioritySuccess = 7007,
    // 流量加速失败
    JGStatusNetworkPriorityFailed = 7008,
    // 流量加速过程中, 网络异常导致重置默认设置
    JGStatusNetworkPriorityResetDefault = 7009,
    
    /// 禁止自动拉流后，收到通知后需要主动开始拉流
    JGStatusInstanceAllocationCompleted = 8001,
    /// 请求第三方的资源池失败
    JGStatusInstanceRequestResourcePoolFailed = 8002,
    /// 质量信息
    JGStatusQualityInfo = 8003,

    /// 初始化SDK完成
    JGStatusInitSDKComplete = 9001,
    /// 分配区域成功
    JGStatusInitApplyAreaSuccess = 9002,
    /// 控制通道建立完成
    JGStatusControlChannelEstablished = 9003,
    /// 控制通道断开
    JGStatusControlChannelDisconnected = 9004,
    /// 媒体操作, 操作子项见 `JGMediaBehavior`
    /// 参数key: mediaBehavior 表示媒体行为
    /// 参数key:bOpen 打开或关闭,对应 JGMediaBehaviorUploadImage存在
    /// 参数key:info 文件名或其他信息
    JGStatusMediaBehavior = 9006,
    /// 传感器等状态同步,见`JGSensorType`
    ///  参数key: type 表示传感器类型 见`JGSensorType`
    ///  参数key:bOpen 表示传感器是开启还是关闭
    JGStatusSensorUpdate = 9007,
    /// 通知手柄震动
    ///  参数key: slotId 表示云端手柄插槽ID
    ///  参数key: left 表示左马达速度
    ///  参数key: right 表示右马达速度
    JGStatusGamepadVibration = 9008,
    
    /// 将停止通知释放资源
    JGStatusWillStopped = 9009,
    
    ///获取到手柄cert
    JGStatusGamepadCert = 9010,
    
    /// LS 质量集团数据
    /// 参数key: info 
    JGStatusQualityGroup = 9011,
    /// 仅作为结束标志，无实际意义
    JGStatusEnd = 29999
};

/// 游戏帧率
typedef NS_ENUM(NSInteger, JGVideoFrame) {
    /// 30帧
    JGVideoFrameNormalFPS = 30,
    /// 60帧
    JGVideoFrameHightFPS = 60
};

/// 视频档位
typedef NS_ENUM(NSInteger, JGVideoLevel) {
    JGVideoLevelLow    = 0,
    JGVideoLevelMiddle = 1,
    JGVideoLevelHight  = 2,
    JGVideoLevelUltrahight = 3
};

/// 视频分辨率
typedef NS_ENUM(NSInteger, JGVideoResolution) {
    JGVideoResolutionP360  = 0,
    JGVideoResolutionP480  = 1,
    JGVideoResolutionP720  = 2,
    JGVideoResolutionP1080 = 3,
    JGVideoResolutionP1440 = 4,
    JGVideoResolutionP4K   = 5
};

/// 视频填充模式
typedef NS_ENUM(NSUInteger, JGVideoFillMode) {
    /// 根据比例裁剪后填充满。
    JGVideoFillModeFill    = 0,
    /// 按比例适配，可能会有黑边。
    JGVideoFillModeFit     = 1,
    /// 自动填充满，可能会变形。
    JGVideoFillModeStretch = 2
};

///设置码率指导调整模式
typedef NS_ENUM(NSInteger, JGBitrateGuidanceAdjustMode) {
    // 流畅度优先模式
    JGBitrateGuidanceAdjustModeFluency = 0,
    // 画质优先模式
    JGBitrateGuidanceAdjustModeQuality = 1,
};

/// 流状态
typedef NS_ENUM(NSUInteger, JGStreamStatus) {
    /// 从暂停串流到重新开始串流
    JGStreamStatusResume = 0,
    /// 从串流到暂停流状态
    JGStreamStatusPause = 1,
};

/// 游戏串流旋转方向
typedef NS_ENUM(NSInteger, JGStreamRotation) {
    /// 横屏流
    JGStreamRotationLandscape = 0,
    /// 竖屏流
    JGStreamRotationPortrait = 1
};

/// 使用的渲染类型
typedef NS_ENUM(NSUInteger, JGVideoRenderedType) {
    // 使用系统自带的CADisplayLayer 渲染
    JGVideoRenderedTypeDisplayLayer= 0,
    // 使用metal 渲染
    JGVideoRenderedTypeMetal= 1,
};

/// 视频流编码类型
typedef NS_ENUM(NSInteger,JGVideoStreamType) {
    ///使用H264
    JGVideoStreamTypeH264 = 1,
    ///使用HEVC(H.265)
    JGVideoStreamTypeHEVC = 2,
    ///使用AV1
    JGVideoStreamTypeAV1 = 3
};

/// 音频会话模式 Playback Mode, Record and Playback Mode
typedef NS_ENUM(NSInteger, JGAudioSessionMode) {
    /// 不开启麦克风使用的模式 (默认模式)
    JGAudioSessionModePlayback,
    /// 开启麦克风同时播放语音模式(使用麦克风时必须切换到这个模式)
    JGAudioSessionModeRecordAndPlayback,
};

/// 音频流编码类型
typedef NS_ENUM(NSInteger,JGAudioStreamType) {
    /// 使用Opus
    JGAudioStreamTypeOpus,
    /// 使用AAC
    JGAudioStreamTypeAAC,
};

// 会议接入状态码
typedef NS_ENUM(NSInteger, JGCloudMeetingStatus) {
    /// 会议状态基准码
    JGCloudMeetingStatusBase = 2500,
    /// 加入会议成功
    JGCloudMeetingStatusJoinSuccess = 2501,
    /// 退出会议
    JGCloudMeetingStatusExit = 2502,
    /// 被踢出
    JGCloudMeetingStatusKick = 2503,
    /// 结束会议
    JGCloudMeetingStatusStop = 2504,
    /// 加入会议失败
    JGCloudMeetingStatusJoinFailed = 2505,
    /// ICE连接失败
    JGCloudMeetingStatusICEConnectFailed = 2506,
    /// ICE添加失败
    JGCloudMeetingStatusICEAddFailed = 2507
};


/// 游戏模式
typedef NS_OPTIONS(NSInteger, JGPlayMode) {
    /// 常规模式
    JGPlayModeNormal = 0,
    /// 切屏模式
    JGPlayModeSwitchScreen = 1 << 0,
    /// 禁止切屏模式
    JGPlayModeDisableSwitchScreen = 1 << 1,
    /// 协助模式
    JGPlayModeAssist = 1 << 2,
    /// 对战模式
    JGPlayModeAgainst = 1 << 3,
    /// 观看模式
    JGPlayModeViewable =  1 << 4,
    /// 会议模式 -- 单独模式
    JGPlayModeMeeting = 1 << 5
};

/// bizType：业务类型
typedef NS_ENUM(NSInteger, JGBizType) {
    /// 无透传
    JGBizTypeNone = 0,
    /// Steam 游戏
    JGBizTypeSteam = 1,
    /// 热血传奇
    JGBizTypeMir2 = 2,
    /// 云原生游戏
    JGBizTypeNativeCloud = 3,
    /// 配置数据透传
    JGBizTypePassThrough = 4
};

/// 游戏类型
typedef NS_ENUM(NSInteger, JGGameType) {
    /// 主机游戏
    JGGameTypePC = 0,
    /// 手游
    JGGameTypePhone
};

/// 流传输使用的连接类型
typedef NS_ENUM(NSInteger, JGConnectType) {
    // 使用XRTC进行连接
    JGConnectTypeXRTC = 0,
    // 使用VRTC进行连接
    JGConnectTypeVRTC = 1,
    // 使用common-C进行连接
    JGConnectTypeCommonC = 2,
    // 使用websocket进行连接
    JGConnectTypeWebSocket = 3
};

/// 触控类型
typedef NS_ENUM(NSUInteger, JGTouchType) {
    // 默认触控
    JGTouchTypeTouch= 0,
    // 将触控模拟成鼠标左键
    JGTouchTypeMouse= 1,
};

/// 发送游戏数据的结果
typedef NS_ENUM(NSInteger,JGSendGameDataResult) {
    // 发送检查成功
    JGSendGameDataResultSuccess = 0,
    // 发送失败
    JGSendGameDataResultFailed = -1,
    // 发送传入的参数错误
    JGSendGameDataResultParameterError = -2,
    // 单次传入数据太长了
    JGSendGameDataResultTooLong = -3
};

/// 手柄卡槽类型
typedef NS_ENUM(NSInteger,JGGamepadSlotType) {
    // 用户本地手柄卡槽(本地插入手柄使用)
    JGGamepadSlotTypeUser = 0,
    // 远端手柄卡槽(扫码手柄使用)
    JGGamepadSlotTypeRemote = 1,
    // 远端认证手柄卡槽(扫码手柄,同时需要加密认证使用)
    JGGamepadSlotTypeAuthRemote = 2,
};

/// 本地媒体操作类型
typedef NS_ENUM(NSInteger, JGMediaBehavior) {
    //打开一个WebPage
    JGMediaBehaviorWebPage = 1,
    //下载一张图片到本地
    JGMediaBehaviorDownloadImage = 2,
    //分享视频或下载视频
    JGMediaBehaviorSharedVideo = 4,
    //下载普通文件
    JGMediaBehaviorDownloadFile = 6,
    //登录信息
    JGMediaBehaviorLoginInfo  = 7,
    //支付信息
    JGMediaBehaviorPayInfo = 8,
    //录屏地址
    JGMediaBehaviorRecoredScreen = 9,
    //手游 activity 信息
    JGMediaBehaviorActivityInfo = 10,
    //上传图片
    JGMediaBehaviorUploadImage = 101
};

/// 本地传感器操作
typedef NS_ENUM(NSInteger, JGSensorType) {
    // 加速度传感器，data[0]=acc.x, data[1]=acc.y, data[2]=acc.z，维度3
    JGSensorTypeAccelerometer = 1,
    // 磁场传感器，data[0]=mag.x, data[1]=mag.y, data[2]=mag.z，维度3
    JGSensorTypeMagneticField = 2,
    // 陀螺仪传感器，data[0]=gyro.x, data[1]=gyro.y, data[2]=gyro.z，维度3
    JGSensorTypeGyroscope = 3,
    // GPS传感器，data[0]=经度，data[1]=纬度，data[2]=海拔，维度5
    JGSensorTypeGPS = 4,
    // 北斗传感器，data[0]=经度，data[1]=纬度，data[2]=海拔，维度5
    JGSensorTypeBDS = 5
};

/// 键盘类型
typedef NS_ENUM(NSInteger,JGKeyboardType) {
    /// windows 系统键盘
    JGKeyboardTypeWin = 0x00,
    /// 安卓系统键盘
    JGKeyboardTypeAndroid = 0x01,
};


typedef NS_ENUM(NSInteger,JGAndroidSystemButton) {
    /// 音量加键
    JGAndroidSystemButtonVolumeUp = 0,
    /// 音量减键
    JGAndroidSystemButtonVolumeDown = 1,
    /// 静音键
    JGAndroidSystemButtonMute = 2,
    /// 按键Home
    JGAndroidSystemButtonHome = 3,
    /// 按键Back
    JGAndroidSystemButtonBack = 4,
    /// 拨号键 5
    JGAndroidSystemButtonCall = 5,
    /// 挂机键 6
    JGAndroidSystemButtonEndCall = 6,
    /// 拍照键 27
    JGAndroidSystemButtonCamera = 27,
    /// 输入完成确认键 66
    JGAndroidSystemButtonReturn = 66,
    /// 拍照对焦键 80
    JGAndroidSystemButtonFocus = 80,
    /// 菜单键 82
    JGAndroidSystemButtonMenu = 82,
    /// 通知键 83
    JGAndroidSystemButtonNotification = 83,
    /// 搜索键 84
    JGAndroidSystemButtonSearch = 84,
    /// 话筒静音键 91
    JGAndroidSystemButtonMicrophoneMute = 91,
    /// 按键List
    JGAndroidSystemButtonList = 187,
    /// 截屏键
    JGAndroidSystemButtonScreenshot = 999
};

/// 设置云端录屏状态
typedef NS_ENUM(NSInteger, JGRecordScreenState) {
    /// 结束录制
    JGRecordScreenStateStop = 0,
    /// 开始录制
    JGRecordScreenStatetart = 1,
    /// 暂停录制
    JGRecordScreenStatePause = 2,
    /// 恢复录制
    JGRecordScreenStateResume = 3,
};

/// 日志级别
typedef  NS_ENUM(NSInteger,JGLogLevel) {
    /// 调试
    JGLogLevelDebug = 0,
    /// 信息
    JGLogLevelInfo = 1,
    /// 警告
    JGLogLevelWarn = 2,
    /// 错误
    JGLogLevelError = 3,
    /// http 请求记录
    JGLogLevelHttp = 4,
    /// 质量信息日志
    JGLogLevelQuality = 5,
    /// 关闭日志
    JGLogLevelDisable = 0xff,
};

/// 当前功能SDK 类型
typedef NS_ENUM(NSInteger, JGSDKType) {
    /// 常规类型
    JGSDKTypeUnion = 0,
    /// 直连类型
    JGSDKTypeDirectcon = 1,
    /// 扫码手柄类型
    JGSDKTypeQRGamepad = 2
};

/// 屏幕比例
typedef NS_ENUM(NSInteger, JGScreenScale) {
    /// 标准 ,按设置分辨率质量标准大小,例如 1920 x 1080 , 1280 x 720 等等
    JGScreenScaleStandard = 0,
    /// 全屏 ,基于当前系统的宽高比进行缩放
    JGScreenScaleFullScreen,
    ///  自己定义宽高比,一般基于显示视图的宽高比,处理异形屏等等场景
    JGScreenScaleCustom
};

#if defined (__cplusplus)
}
#endif
#endif


